bitkeeper revision 1.1208 (4212ad8c5vLMbRL8isvvSTbC88iL5Q)
authormwilli2@equilibrium.research <mwilli2@equilibrium.research>
Wed, 16 Feb 2005 02:18:52 +0000 (02:18 +0000)
committermwilli2@equilibrium.research <mwilli2@equilibrium.research>
Wed, 16 Feb 2005 02:18:52 +0000 (02:18 +0000)
usbfront: eliminate the urb_remove_list

Signed-off-by: mark.williamson@cl.cam.ac.uk
linux-2.6.10-xen-sparse/drivers/xen/usbfront/usbfront.c
linux-2.6.10-xen-sparse/drivers/xen/usbfront/xhci.h

index 273fe75bec361da1e51d6c9aa5b49a6eafd4d38e..264c3e6b073337d97a939520d77a8a5ad38f279a 100644 (file)
@@ -380,8 +380,6 @@ static void receive_usb_io(usbif_response_t *resp)
         struct urb *urb = urbp->urb;
 
         urb->actual_length = resp->length;
-       urb->status = resp->status;
-       urbp->status = resp->status;
         urbp->in_progress = 0;
 
         if( usb_pipetype(urb->pipe) == 0 ) /* ISO */
@@ -398,6 +396,12 @@ static void receive_usb_io(usbif_response_t *resp)
                 }
                 free_page((unsigned long)urbp->schedule);
         }
+
+        /* Only set status if it's not been changed since submission.  It might
+         * have been changed if the URB has been unlinked asynchronously, for
+         * instance. */
+       if ( urb->status == -EINPROGRESS )
+                urbp->status = urb->status = resp->status;
 }
 
 /**
@@ -567,7 +571,7 @@ static void xhci_destroy_urb_priv(struct urb *urb)
         return;
 
     if (!list_empty(&urb->urb_list))
-        warn("xhci_destroy_urb_priv: urb %p still on xhci->urb_list or xhci->remove_list", urb);
+        warn("xhci_destroy_urb_priv: urb %p still on xhci->urb_list", urb);
     
     if (!list_empty(&urbp->complete_list))
         warn("xhci_destroy_urb_priv: urb %p still on xhci->complete_list", urb);
@@ -849,8 +853,6 @@ static int xhci_unlink_urb(struct urb *urb)
 
        list_del_init(&urb->urb_list);
 
-       xhci_delete_urb(urb);
-
        /* Short circuit the virtual root hub */
        if (urb->dev == xhci->rh.dev) {
                rh_unlink_urb(urb);
@@ -861,17 +863,12 @@ static int xhci_unlink_urb(struct urb *urb)
                xhci_call_completion(urb);
        } else {
                if (urb->transfer_flags & USB_ASYNC_UNLINK) {
+                        /* We currently don't currently attempt to cancel URBs
+                         * that have been queued in the ring.  We handle async
+                         * unlinked URBs when they complete. */
                        urbp->status = urb->status = -ECONNABORTED;
-
-                       spin_lock(&xhci->urb_remove_list_lock);
-
-                       list_add(&urb->urb_list, &xhci->urb_remove_list);
-
-                       spin_unlock(&xhci->urb_remove_list_lock);
-
                        spin_unlock(&urb->lock);
                        spin_unlock_irqrestore(&xhci->urb_list_lock, flags);
-
                } else {
                        urb->status = -ENOENT;
 
@@ -887,6 +884,8 @@ static int xhci_unlink_urb(struct urb *urb)
                        } else
                                schedule_timeout(1+1*HZ/1000); 
 
+                        xhci_delete_urb(urb);
+
                        xhci_call_completion(urb);
                }
        }
@@ -1419,9 +1418,6 @@ static int alloc_xhci(void)
 
        xhci->state = USBIF_STATE_CLOSED;
 
-       spin_lock_init(&xhci->urb_remove_list_lock);
-       INIT_LIST_HEAD(&xhci->urb_remove_list);
-
        spin_lock_init(&xhci->urb_list_lock);
        INIT_LIST_HEAD(&xhci->urb_list);
 
index 233cf410507a426cf272524c6373d7106ffeccdf..f503e59ebc3bcd1a2f57dcc1bc2ac6b35471ba21 100644 (file)
@@ -68,10 +68,6 @@ struct xhci {
        spinlock_t urb_list_lock;
        struct list_head urb_list;              /* P: xhci->urb_list_lock */
 
-       /* List of asynchronously unlinked URB's */
-       spinlock_t urb_remove_list_lock;
-       struct list_head urb_remove_list;       /* P: xhci->urb_remove_list_lock */
-
        /* List of URB's awaiting completion callback */
        spinlock_t complete_list_lock;
        struct list_head complete_list;         /* P: xhci->complete_list_lock */